package com.media.system.common.utils;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.media.system.common.core.page.PageDomain;
import com.media.system.common.core.page.TableSupport;
import com.media.system.common.utils.sql.SqlUtil;

import java.util.List;

/**
 * 分页工具类
 * 
 * @author Claude
 * @since 2024-01-20
 */
public class PageUtils {

    /**
     * 设置请求分页数据
     */
    public static void startPage() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        
        // MyBatis Plus的分页从第1页开始
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            Boolean reasonable = pageDomain.getReasonable();
            PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
        }
    }

    /**
     * 设置请求排序数据
     */
    public static void startOrderBy() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.orderBy(orderBy);
        }
    }

    /**
     * 获取分页对象
     */
    public static <T> Page<T> buildPage() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        
        if (StringUtils.isNull(pageNum) || StringUtils.isNull(pageSize)) {
            return new Page<>();
        }

        Page<T> page = new Page<>(pageNum, pageSize);
        
        String orderByColumn = pageDomain.getOrderByColumn();
        String isAsc = pageDomain.getIsAsc();
        if (StringUtils.isNotEmpty(orderByColumn)) {
            String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);
            if ("asc".equals(isAsc)) {
                page.addOrder(OrderItem.asc(orderBy));
            } else if ("desc".equals(isAsc)) {
                page.addOrder(OrderItem.desc(orderBy));
            }
        }
        
        return page;
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }

    /**
     * 获取总记录数（兼容PageHelper）
     */
    public static long getTotal(List<?> list) {
        if (list instanceof com.github.pagehelper.Page) {
            return ((com.github.pagehelper.Page<?>) list).getTotal();
        }
        return list.size();
    }

    // PageHelper兼容类
    private static class PageHelper {
        public static <E> com.github.pagehelper.Page<E> startPage(int pageNum, int pageSize, String orderBy) {
            // 这里应该使用实际的PageHelper
            // 为了编译通过，暂时返回一个空实现
            return new com.github.pagehelper.Page<>(pageNum, pageSize);
        }
        
        public static void orderBy(String orderBy) {
            // PageHelper排序实现
        }
        
        public static void clearPage() {
            // 清理PageHelper线程变量
        }
    }
}